package com.qing.design.patterns.singleton.example.thread_safe;

public class Singleton {
	//字段必须声明为volatile，这样双重检查锁才能工作
	//正确的
	private static  volatile  Singleton instance;

	public String value;

	private Singleton(String value){
		this.value=value;
	}

	//这里采用的方法称为双重检查锁定（DCL）。信息技术
	//存在以防止多个线程之间的争用条件可能导致
	//尝试同时获取单例实例，创建单独的
	//结果是。
	//
	//在这里输入'result'变量似乎完全是错误的
	//毫无意义。然而，有一个非常重要的警告
	//在Java中实现双重检查锁
	//引入这个局部变量。
	//
	//您可以在此处阅读Java中DCL问题的更多信息：
	// https://refactoring.guru/java-dcl-issue
	public static Singleton getInstance(String value) {
		Singleton result=instance;
		if(result!=null){
			return result;
		}
		synchronized (Singleton.class){
			if(instance==null){
				instance=new Singleton(value);
			}
			return instance;
		}
	}
}
